import os
from openai import OpenAI
from hybrid_search import hybrid_search  # 导入混合检索函数


def get_response(messages):
    """
    调用LLM生成回答

    参数:
        messages: 对话历史列表，格式为[{"role": "角色", "content": "内容"}, ...]

    返回:
        LLM生成的回答文本
    """
    # 初始化客户端（支持本地模型或阿里云通义千问）
    client = OpenAI(
        # 本地模型示例（如用Ollama部署的qwen）
        # api_key="sk-xxx",  # 本地模型可随意填写
        base_url="http://localhost:11434/v1",

        # 阿里云通义千问（需要真实API密钥）
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        #base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )

    # 调用LLM
    completion = client.chat.completions.create(
        model="qwen:latest",  # 本地模型或"qwen-plus"（阿里云）
        messages=messages,
        temperature=0.3  # 控制回答随机性，0.3表示较稳定
    )
    return completion.choices[0].message.content


def rag_pipeline(user_query):
    """
    完整RAG流程：检索→生成

    参数:
        user_query: 用户的问题

    返回:
        最终答案
    """
    # 1. 执行混合检索获取相关片段
    search_results = hybrid_search(user_query, top_k=3)  # 取最相关的3个片段

    # 2. 构建提示词（将检索结果作为上下文）
    context = "\n".join([
        f"参考内容{i + 1}（页码{res['page_num']}）：{res['text']}"
        for i, res in enumerate(search_results)
    ])

    # 3. 构建对话历史（系统提示+上下文+用户问题）
    messages = [
        {
            "role": "system",
            "content": "你是平安保险客服助手，需要根据提供的参考内容回答用户问题，确保答案准确且基于参考内容，不要编造信息。如果参考内容中没有相关信息，直接说明'没有找到相关信息'。"
        },
        {
            "role": "user",
            "content": f"参考内容如下：\n{context}\n\n请根据以上参考内容回答：{user_query}"
        }
    ]

    print(f"提示词:{messages}")

    # 4. 调用LLM生成回答
    answer = get_response(messages)
    return answer


# 测试代码
if __name__ == "__main__":
    # 用户问题
    user_query = "平安福2024版有什么变化？"

    # 执行完整RAG流程
    answer = rag_pipeline(user_query)

    # 输出结果
    print(f"用户问题：{user_query}\n")
    print("回答：")
    print(answer)
